#ifndef prs_FrmGeomDirect_H
#define prs_FrmGeomDirect_H

#include "prs_FrmNodes.h"
#include "prs_FrmValue.h"
#include "frm_geometry.h"

namespace prs {

///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmGeomDirect : public TNodeFrm
{
  //DECLARE_AbstractClientNode();
  //
  enum EType
  {
    EType_Vert,
    EType_Horz,
  };
  //
  virtual EType GetEType()=0;
  virtual frm::geometry::TDirectChildren *NewOld()=0;

private:
  int size;
};

///////////////////////////////////////////////////////////////////////////////

struct TFrmGeomDirectValue : public TFrmPointerNodeOwnerValue<TNodeFrmGeomDirect*>
{
  DECLARE_ClientNodeEx(nodeType_TFrmGeomDirectValue)
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmGeomDirectVert : public TNodeFrmGeomDirect
{
  DECLARE_ClientNode();
  //
  virtual EType GetEType() { return EType_Vert;}
  virtual frm::geometry::TDirectChildren *NewOld() { return new frm::geometry::TVert;}
};

///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmGeomDirectHorz : public TNodeFrmGeomDirect
{
  DECLARE_ClientNode();
  //
  virtual EType GetEType() { return EType_Horz;}
  virtual frm::geometry::TDirectChildren *NewOld() { return new frm::geometry::THorz;}
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

struct TRuleFrmGeomDirect //: public snt::TRule
{
  snt::TRule RDirect,RValue;
  //
  TRuleFrmGeomDirect(
    snt::text::TContext &SntContext
  );
  //
  void EnableSetParamAsIdent(bool V) { vEnSetParamAsIdent = V;}
  void SetAttr(TAttrPointerBase *Attr) { attr = Attr;}

private:  
  void FGetEnumDirect(snt::text::TEnumSet::TFuncGetEnumSetParams &Params);
  bool FSetEnumDirect(snt::text::TEnumSet::TFuncDoEntryParams    &Params);
  void FEnableSetParamAsIdent(snt::TParams &Params);
  bool FSetParamAsIdent(snt::text::TIdent::TFuncClosureDoEntryParams &Params);
  //
  struct TType : public svl::TEnumSet {
    TType() : svl::TEnumSet (
      "vert",TNodeFrmGeomDirect::EType_Vert,
      "horz",TNodeFrmGeomDirect::EType_Horz
    ){}
  };
  //
  static TType Type;
  
  static TNodeFrmGeomDirectVert Vert; 
  static TNodeFrmGeomDirectHorz Horz; 

  TAttrPointerBase *attr;
  svl::TVariant vEnSetParamAsIdent;
  svl_Except;
};

///////////////////////////////////////////////////////////////////////////////
}

#endif
